package com.jt;


import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication//本身就是配置类
@EnableFeignClients//启动时为@FeignClient注解描述的接口创建实现类及对象，然后交给spring管理
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    //基于此对象进行远端服务的调用
    //例如sca-consumer调用sca-provider
    @Bean
    //@LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    /**
     * 使用loadBalanced注解,RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截，
     * 它的作用就是用于RestTemplate的负载均衡，
     * LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer
     */

    @Bean
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate(){
        return new RestTemplate();
    }

    /**
     * 指定默认的负载均衡策略，但是这种配置方式不够灵活
     * @return
     */
//    @Bean
//    public IRule rule(){
//        return new RandomRule();
//    }

    //底层默认逻辑实现，@ConditionalOnMissingBean注解配合@Bean注解一起使用时，
    //会在没有指定Bean时，才去创建这个Bean对象。
//    @Bean
//    @ConditionalOnMissingBean(IRule.class)
//    public IRule rule(){
//        return new BestAvailableRule();
//    }
}
